home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Other Langs / MacPerl ƒ / Perl Source ƒ / MacPerl / MPAEUtils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-30  |  4.6 KB  |  202 lines  |  [TEXT/MPS ]

  1. /*********************************************************************
  2. Project    :    MacPerl            -    Real Perl Application
  3. File        :    MPAEUtils.c        -
  4. Author    :    Matthias Neeracher
  5.  
  6. A lot of this code is borrowed from 7Edit written by
  7. Apple Developer Support UK
  8.  
  9. Started    :    17Mar93                                Language    :    MPW C
  10. Modified    :    17Mar93    MN
  11.                 29May93    MN    Compiles correctly
  12. Last        :    29May93
  13. *********************************************************************/
  14.  
  15. #pragma segment Main
  16.  
  17. #include "MPAEUtils.h"
  18. #include "MPUtils.h"
  19.  
  20. #include <AERegistry.h>
  21.  
  22.  
  23. /**-----------------------------------------------------------------------
  24.     Utility Routines for getting data from AEDesc's
  25.   -----------------------------------------------------------------------**/
  26.  
  27. pascal void GetRawDataFromDescriptor(
  28.     const AEDesc *theDesc,
  29.     Ptr     destPtr,
  30.     Size    destMaxSize,
  31.     Size    *actSize)
  32. {
  33.     Size copySize;
  34.  
  35.     if (theDesc->dataHandle) {
  36.         HLock((Handle)theDesc->dataHandle);
  37.         *actSize = GetHandleSize((Handle)theDesc->dataHandle);
  38.  
  39.         copySize = LesserOf(*actSize, destMaxSize);
  40.  
  41.         BlockMove(*theDesc->dataHandle, destPtr, copySize);
  42.  
  43.         HUnlock((Handle)theDesc->dataHandle);
  44.     } else
  45.         *actSize = 0;
  46. } /*GetRawDataFromDescriptor*/
  47.  
  48. pascal OSErr GetPStringFromDescriptor(const AEDesc *sourceDesc, char *resultStr)
  49. {
  50.     OSErr        myErr;
  51.     Size     stringSize;
  52.     AEDesc   resultDesc;
  53.  
  54.     resultStr[0] = 0;
  55.  
  56.     if (myErr = AECoerceDesc(sourceDesc, typeChar, &resultDesc))
  57.         return myErr;
  58.  
  59.     GetRawDataFromDescriptor(&resultDesc, (Ptr)&resultStr[1], 255, &stringSize);
  60.  
  61.     if (stringSize<256)
  62.         resultStr[0] = (char)stringSize;
  63.     else
  64.         myErr = errAECoercionFail;
  65.  
  66.     if (resultDesc.dataHandle)
  67.         AEDisposeDesc(&resultDesc);
  68.  
  69.     return myErr;
  70. }
  71.  
  72. pascal OSErr GetIntegerFromDescriptor(const AEDesc *sourceDesc, short *result)
  73. {
  74.     OSErr   myErr;
  75.     Size    intSize;
  76.     AEDesc  resultDesc;
  77.  
  78.     *result = 0;
  79.  
  80.     if (myErr = AECoerceDesc(sourceDesc, typeShortInteger, &resultDesc))
  81.         return myErr;
  82.  
  83.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, 2, &intSize);
  84.     if (intSize>2)
  85.         myErr = errAECoercionFail;
  86.  
  87.     if (resultDesc.dataHandle)
  88.         AEDisposeDesc(&resultDesc);
  89.  
  90.     return myErr;
  91. }
  92.  
  93. pascal OSErr GetBooleanFromDescriptor(const AEDesc *sourceDesc, Boolean *result)
  94. {
  95.     OSErr  myErr;
  96.     Size   boolSize;
  97.     AEDesc resultDesc;
  98.  
  99.     *result = false;
  100.  
  101.     if (myErr = AECoerceDesc(sourceDesc, typeBoolean,&resultDesc))
  102.         return myErr;
  103.  
  104.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Boolean), &boolSize);
  105.     if (boolSize>sizeof(Boolean))
  106.         myErr = errAECoercionFail;
  107.  
  108.     if (resultDesc.dataHandle)
  109.         AEDisposeDesc(&resultDesc);
  110.  
  111.     return myErr;
  112. }
  113.  
  114. pascal OSErr GetLongIntFromDescriptor(const AEDesc *sourceDesc, long   *result)
  115. {
  116.     OSErr   myErr;
  117.     Size    intSize;
  118.     AEDesc  resultDesc;
  119.  
  120.     *result = 0;
  121.  
  122.     if (myErr = AECoerceDesc(sourceDesc, typeLongInteger, &resultDesc))
  123.         return myErr;
  124.  
  125.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, 4, &intSize);
  126.     if (intSize>4)
  127.         myErr = errAECoercionFail;
  128.  
  129.     if (resultDesc.dataHandle)
  130.         AEDisposeDesc(&resultDesc);
  131.  
  132.     return myErr;
  133. } /*GetLongIntFromDescriptor*/
  134.  
  135. pascal OSErr GetRectFromDescriptor(const AEDesc *sourceDesc, Rect *result)
  136. {
  137.     OSErr   myErr;
  138.     Size    rectSize;
  139.     AEDesc  resultDesc;
  140.  
  141.     SetRect(result,0,0,0,0);
  142.  
  143.     if (myErr = AECoerceDesc(sourceDesc,typeQDRectangle,&resultDesc))
  144.         return myErr;
  145.  
  146.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Rect),  &rectSize);
  147.     if (rectSize<sizeof(Rect))
  148.         myErr = errAECoercionFail;
  149.  
  150.     if (resultDesc.dataHandle)
  151.         AEDisposeDesc(&resultDesc);
  152.  
  153.     return myErr;
  154. } /*GetRectFromDescriptor*/
  155.  
  156. pascal OSErr GetPointFromDescriptor(const AEDesc *sourceDesc, Point  *result)
  157. {
  158.     OSErr   myErr;
  159.     Size    ptSize;
  160.     AEDesc  resultDesc;
  161.  
  162.     SetPt(result,0,0);
  163.  
  164.     if (myErr = AECoerceDesc(sourceDesc,typeQDPoint,&resultDesc))
  165.         return myErr;
  166.  
  167.     GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Point), &ptSize);
  168.     if (ptSize<sizeof(Point))
  169.         myErr = errAECoercionFail;
  170.  
  171.     if (resultDesc.dataHandle)
  172.         AEDisposeDesc(&resultDesc);
  173.  
  174.     return myErr;
  175. } /*GetPointFromDescriptor*/
  176.  
  177.  
  178. /*
  179.     Name:    PutStyledTextFromDescIntoTEHandle
  180.     Purpose: Takes the text in an AEDesc containing typeIntlText and puts it in
  181.              a styled text edit record at the current insertion point.
  182.                      Looks for typeIntlText, typeStyledText, typeChar in that order.
  183. */
  184.  
  185. pascal OSErr GetTextFromDescIntoTEHandle(const AEDesc *sourceTextDesc, TEHandle theHTE)
  186. {
  187.     AEDesc rawTextDesc;
  188.     OSErr  myErr;
  189.  
  190.     if (myErr = AECoerceDesc(sourceTextDesc, typeChar, &rawTextDesc))
  191.         return myErr;
  192.  
  193.     HLock((Handle)rawTextDesc.dataHandle);
  194.     TEInsert((*rawTextDesc.dataHandle), GetHandleSize(rawTextDesc.dataHandle), theHTE);
  195.     HUnlock((Handle)rawTextDesc.dataHandle);
  196.  
  197.     if (rawTextDesc.dataHandle)
  198.         AEDisposeDesc(&rawTextDesc);
  199.  
  200.     return noErr;
  201. }
  202.